#include <iostream>
#include <unistd.h>
#include <signal.h>


// 1234, 
// 1024*4*8
// 4*8=32
// 1234/32 = ? (起始下标)
// 1234%32 = ? (指定位置的第几个比特位)
// struct bitmap
// {
//     int maps[1024];
// };

void PrintPending(const sigset_t &pending)
{
    for(int signo = 31; signo > 0; signo--)
    {
        if(sigismember(&pending, signo))
        {
            std::cout << "1";
        }
        else
        {
            std::cout << "0";
        }
    }
    std::cout << "\n";
}

void handler(int signo)
{
    sigset_t pending;

    std::cout << "###############################"<< std::endl;
    sigpending(&pending);
    PrintPending(pending);
    std::cout << "###############################"<< std::endl;

    std::cout << "handler " << signo << std::endl;
    // exit(100);
}

int main()
{
    signal(2, handler);

    while(true)
    {
        sleep(1);
    }
    // std::cout << "getpid: " << getpid() << std::endl;

    // // 1. 屏蔽2号信号
    // sigset_t set, oset;
    // sigemptyset(&set);
    // sigemptyset(&set);
    // sigaddset(&set, 2);
    // sigprocmask(SIG_BLOCK, &set, &oset);

    // // 2. 让进程不断获取当前进程的pending
    // int cnt = 0;
    // sigset_t pending;
    // while(true)
    // {
    //     sigpending(&pending);
    //     PrintPending(pending);

    //     sleep(1);

    //     cnt++;

    //     if(cnt == 5)
    //     {
    //         std::cout << "解除对2号信号的屏蔽, 2号信号准备递达" << std::endl;
    //         sigprocmask(SIG_SETMASK, &oset, nullptr);
    //     }
    // }



    // std::cout << "getpid: " << getpid() << std::endl;

    // signal(2, handler);

    // sigset_t block, oblock;

    // sigemptyset(&block);
    // sigemptyset(&oblock);

    // for(int signo = 1; signo <= 31; signo++) sigaddset(&block, signo);    //在这里就设置了对2号信号的屏蔽吗？？？没有！

    // sigprocmask(SIG_SETMASK, &block, &oblock);

    // while(true)
    // {
    //     std::cout << "我已经屏蔽了所有的信号, 来打我啊！" << std::endl;
    //     sleep(1);
    // }

    // std::cout << "getpid: " << getpid() << std::endl;

    // signal(2, handler);
    // signal(2, SIG_IGN);
    // signal(2, SIG_DFL);

    // std::cout << "getpid: " << getpid() << std::endl;
    // std::cout << "getpid: " << getpid() << std::endl;
    // std::cout << "getpid: " << getpid() << std::endl;
    // std::cout << "getpid: " << getpid() << std::endl;
    // while(true)
    // {
    //     sleep(1);
    // }

    // int a = 10;
    // a /= 0;
    // std::cout << "getpid: " << getpid() << std::endl;
    // std::cout << "getpid: " << getpid() << std::endl;
    // std::cout << "getpid: " << getpid() << std::endl;
    // std::cout << "getpid: " << getpid() << std::endl;
    // std::cout << "getpid: " << getpid() << std::endl;
    // std::cout << "getpid: " << getpid() << std::endl;
    // std::cout << "getpid: " << getpid() << std::endl;
    // std::cout << "getpid: " << getpid() << std::endl;
    // std::cout << "getpid: " << getpid() << std::endl;

    return 0;
}